/**
 * 路由守卫
 */

//导入路由
import router from './router'
import store from './store'
//路由白名单
import routerWhiteList from '@/utils/router-white-list'

//路由跳转加载进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { error404 } from '@/utils/error404'
import setPageTitle from '@/utils/set-page-title'

// 取消右上角的正在加载
NProgress.configure({ showSpinner: false })

//获取白名单
const whiteList = routerWhiteList()



//全局前置路由守卫
router.beforeEach(async(to, from, next) => {
	NProgress.start()
	
	//设置页面title
	document.title = setPageTitle(to.meta.title)
	
	//判断用户是否登录
	if(store.getters.token){
		//判断是否前往登录页面
		if(to.path === '/login'){
			//前往登录页面
			next({ path: 'login' })
			NProgress.done()
		}else{
			//判断是否已经获取用户信息以及路由菜单列表
			if(store.getters.menus.length === 0){
				//调用vuex中的方法，获取用户信息以及路由菜单
				let { menus } = await store.dispatch('user/getInfo')
				//将菜单列表进行转换，生成路由表并存到vuex中
				let accessedRouters = await store.dispatch('permission/getMenus',menus)
				//从vuex中取出路由表，进行动态添加，最后再添加404页面，防止页面刷新后跳转到404页面
				router.addRoutes([...accessedRouters,error404])
				next({ ...to, replace: true })
			}else{
				//已经有用户信息和路由菜单，放行
				next()
			}
		}
	}else{
		//没有token，判断要跳转的路由是否在白名单中
		if(whiteList.indexOf(to.path) !== -1){
			//放行
			next()
		}else{
			//非法跳转，重定向
			next({ path: '/index' })
			NProgress.done()
		}
	}
})

//全局后置路由
router.afterEach((to, from) => {
  NProgress.done() //动画结束
})